﻿using System;
using System.Collections.Generic;
using System.Diagnostics.Contracts;

namespace Isuka.Excel
{
    public partial interface IXGrid
        : IXRangeEnumerable
        , IEnumerable<XRange>
        , IDisposable
    {
        /// <summary>
        /// 指定したセル範囲のオフセット値で指定される範囲を表す Range オブジェクトを返します。
        /// </summary>
        /// <param name="row">相対行オフセット</param>
        /// <param name="column">相対列オフセット</param>
        /// <returns>セル</returns>
        XRange this[int rowIndex, int columnIndex]
        {
            get;
        }

        /// <summary>
        /// 指定したセル範囲のオフセット値で指定される範囲を表す Range オブジェクトを返します。
        /// </summary>
        /// <param name="rowIndex">行番号。0からスタート</param>
        /// <param name="columnIndex">列名。A,B,C...</param>
        /// <returns>セル</returns>
        XRange this[int rowIndex, string columnIndex]
        {
            get;
        }

        /// <summary>
        ///セル範囲の列を表す XRange オブジェクト
        /// </summary>
        XRange Columns { get; }

        /// <summary>
        /// セル範囲の行を表す XRange オブジェクト
        /// </summary>
        XRange Rows { get; }
    }

    #region IXGrid contract binding
    [ContractClass(typeof(IXGridContract))]
    public partial interface IXGrid
    {
    }

    [ContractClassFor(typeof(IXGrid))]
    abstract class IXGridContract : IXGrid
    {
        #region IXGrid メンバー

        public XRange this[int rowIndex, int columnIndex]
        {
            get
            {
                Contract.Ensures(Contract.Result<XRange>() != null);
                throw new NotImplementedException();
            }
        }

        public XRange this[int rowIndex, string columnIndex]
        {
            get
            {
                Contract.Requires<ArgumentNullException>(columnIndex != null, "columnIndex");
                Contract.Ensures(Contract.Result<XRange>() != null);
                throw new NotImplementedException();
            }
        }

        public XRange Columns
        {
            get
            {
                Contract.Ensures(Contract.Result<XRange>() != null);
                throw new NotImplementedException();
            }
        }

        public XRange Rows
        {
            get
            {
                Contract.Ensures(Contract.Result<XRange>() != null);
                throw new NotImplementedException();
            }
        }

        #endregion

        #region IEnumerable<XRange> メンバー

        public IEnumerator<XRange> GetEnumerator()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region IEnumerable メンバー

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region IDisposable メンバー

        public void Dispose()
        {
            throw new NotImplementedException();
        }

        #endregion
    }
    #endregion

}
